package com.study.thread.juc.concurrent;

import java.util.concurrent.CopyOnWriteArrayList;

/*
    CopyOnWriteArrayList：是一个线程安全的ArrayList，底层也是操作的数组，通过写时复制数组的方式来修改数组并保证线程安全。
           写入：写入时通过ReentrantLock来加锁保证只有一个线程写入，然后复制一个数组，长度在原数组长度+1，然后替换写入的值，然后重新替换当前底层array数组的引用
           获取：获取到当前array数组，然后直接通过下标获取！

 */
public class CopyOnWriteArryListDemo1 {

    private static CopyOnWriteArrayList copyList = new CopyOnWriteArrayList();


    public static void main(String[] args) {

        for (int i = 0; i <20 ; i++) {
            copyList.add("count"+i);
        }
        for (int i = 0; i <copyList.size() ; i++) {
            copyList.remove(i);
        }
        System.out.println(copyList);

        /*new Thread(()->{
            for (int i = 3; i <copyList.size() ; i++) {
                if(i==12){
                    try {
                        System.out.println("睡眠");
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(copyList.get(i));

            }
        }).start();*/
        new Thread(()->{
           /* for (int i = 3000; i <3020 ; i++) {
                if(3000){

                }
                copyList.set(15,i);
            }*/
            for (int i = 0; i <copyList.size() ; i++) {
                copyList.remove(i);
            }
        }).start();

    }
}
